]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
search: Only do a subsearch if the previous results have returned from DBus
authorJasper St. Pierre <jstpierre@mecheye.net>
Mon, 4 Nov 2013 19:47:13 +0000 (14:47 -0500)
committerJasper St. Pierre <jstpierre@mecheye.net>
Mon, 4 Nov 2013 19:50:45 +0000 (14:50 -0500)
There's a potential race condition in the search code: if we have an
outstanding search call to a provider for search "A", and if before it comes
back we do a subsearch for "AB", we won't have any results to pass along.

Previously, we used an empty list when storing the provider results, so we
effectively told the remote search app to filter through this empty list for
any search results that meet the new query, meaning we showed the user 0
results for the provider in this case.

Now that we don't store an empty list, but instead store `undefined`, this race
raises a warning. Solve it by doing an initial search query in this case
instead.

The search code isn't too smart about chained subsearches: now, if we hit this
race while already on a subsearch, we'll do an initial search for the subsearch
query instead, but that is much better than showing the user nothing. This
could be fixed in the future for a performance improvement.

Reviewed-by: Florian Müllner <fmuellner@gnome.org>
js/ui/search.js

index 4bde7fcba31ed9e4ace6836271abf78873543164..50868e386e869e7ac442279b8fc51b2957e09d62 100644 (file)
@@ -110,16 +110,13 @@ const SearchSystem = new Lang.Class({
 
         this._terms = terms;
 
-        if (isSubSearch) {
-            this._providers.forEach(Lang.bind(this, function(provider) {
-                let previousProviderResults = previousResults[provider.id];
+        this._providers.forEach(Lang.bind(this, function(provider) {
+            let previousProviderResults = previousResults[provider.id];
+            if (isSubSearch && previousProviderResults)
                 provider.getSubsearchResultSet(previousProviderResults, terms, Lang.bind(this, this._gotResults, provider), this._cancellable);
-            }));
-        } else {
-            this._providers.forEach(Lang.bind(this, function(provider) {
+            else
                 provider.getInitialResultSet(terms, Lang.bind(this, this._gotResults, provider), this._cancellable);
-            }));
-        }
+        }));
     }
 });
 Signals.addSignalMethods(SearchSystem.prototype);